\documentclass[a4paper,11pt,oneside]{article}
\usepackage[german]{hgb}	 % options: german, english
\graphicspath{{images/}}   	% where are the EPS images?
\usepackage[margin=3cm]{geometry}

%% FOR NICER TABLES
\usepackage{tabularx}
\setlength\parindent{0pt} 

%%%----------------------------------------------------------
\begin{document}
%%%----------------------------------------------------------

\author{Alexander Bohn \\
	     Manuel Djalili \\
	     Dominik Gruber \\
	     Manuel Mayrhofer \\
	     Philipp Naderer}
				
\title{QSE-ASE-08\\Tenez\\Systemdokumentation}

\date{Jänner 2010}

%%%----------------------------------------------------------
\maketitle
%%%----------------------------------------------------------

%%%----------------------------------------------------------
\section{JSDoc}
%%%----------------------------------------------------------

\url{http://tenez.at/apidocs/js/}

%%%----------------------------------------------------------
\section{Klassendiagramm}
%%%----------------------------------------------------------

Eine aktuelle Version des Klassendiagramms ist jederzeit unter \url{http://tenez.at/apidocs/uml/tenezuml.png} abrufbar.

%%%----------------------------------------------------------
\section{Berechtigungen für Benutzer}
%%%----------------------------------------------------------

Tenez benutzt ein rollenbasiertes Zugriffssystem. Dabei werden einzelne Rechte (Permission) einer Benutzerrolle (PermissionGroup) zugeordnet. Jeder User, der Zugriff auf die Admin-Applikation erlangen kann, ist genau einer Rolle zugeordnet. Ein User kann nicht mehrere Rollen gleichzeitig einnehmen.
\\\\
Ein bestimmtes Recht (Permission) wird als String gespeichert, der gleichzeitig Auskunft über die damit verbundenen Möglichkeiten gibt. Ein Benutzer, der Auswertungen ansehen möchte, benötigt z.B. das Recht \texttt{can\_view\_reports}. In der zugehörigen Action braucht nun nur noch auf \texttt{userObj.hasPermission("can\_view\_reports")} abgefragt werden. Rückgabewert ist entweder true oder false.
\\\\
Befindet man sich in einer dem Club zugehörigen bzw. untergeordneten Action, muss zusätzlich noch mit userObj.canAccess() die Zugehörigkeit des Benutzers zum aktuellen Club überprüfen. Bei einem Systemadministrator liefert canAccess() immer den Wert true zurück.
\\\\
\textbf{Beispiel für den User \emph{Max Hallenwärter}:}\\
User: Max Hallenwärter\\
PermissionGroup: Hallenwart\\
Permission: \texttt{can\_edit\_timeslots}
\subsection{Berechtigungsgruppen und Berechtigungen}
\begin{tabular}{|p{5.0cm}|p{9cm}|}
\hline
\multicolumn{1}{|l|}{\textbf{Systemadministrator}} \\
\hline
can\_access\_own\\
can\_access\_all\\
can\_edit\_club\\
can\_add\_club\\
can\_view\_locations\\
can\_edit\_locations\\
can\_add\_locations\\
can\_view\_courts\\
can\_edit\_courts\\
can\_add\_courts\\
can\_view\_timeslots\\
can\_edit\_timeslots\\
can\_add\_timeslots\\
can\_delete\_timeslots\\
can\_view\_reservations\\
can\_add\_reservations\\
can\_delete\_reservations\\
can\_view\_sysadmins\\
can\_edit\_sysadmins\\
can\_add\_sysadmins\\
can\_view\_users\\
can\_edit\_users\\
can\_add\_users\\
can\_delete\_users\\
can\_view\_usergroups\\
can\_edit\_usergroups\\
can\_add\_usergroups\\
can\_set\_permissiongroup\\
can\_view\_reports\\
can\_view\_sent\_newsletters\\
can\_send\_newsletters\\
can\_view\_bookings\\
can\_add\_bookings\\
can\_view\_log\\
\hline
\end{tabular}

\begin{tabular}{|p{5.0cm}|p{9cm}|}
\hline
\multicolumn{1}{|l|}{\textbf{Hallenwart}} \\
\hline
can\_access\_own\\
can\_edit\_club\\
can\_view\_locations\\
can\_edit\_locations\\
can\_view\_courts\\
can\_edit\_courts\\
can\_view\_timeslots\\
can\_edit\_timeslots\\
can\_add\_timeslots\\
can\_delete\_timeslots\\
can\_view\_reservations\\
can\_add\_reservations\\
can\_delete\_reservations\\
can\_view\_users\\
can\_edit\_users\\
can\_add\_users\\
can\_view\_usergroups\\
can\_edit\_usergroups\\
can\_add\_usergroups\\
can\_view\_reports\\
can\_view\_sent\_newsletters\\
can\_send\_newsletters\\
can\_view\_bookings\\
can\_add\_bookings\\
can\_view\_log\\
\hline
\end{tabular}

\begin{tabular}{|p{5.0cm}|p{9cm}|}
\hline
\multicolumn{1}{|l|}{\textbf{Vorstand}} \\
\hline
can\_access\_own\\
can\_view\_reservations\\
can\_view\_users\\
can\_view\_reports\\
can\_view\_sent\_newsletters\\
can\_send\_newsletters\\
can\_view\_bookings\\
can\_view\_log\\
\hline
\end{tabular}

\begin{tabular}{|p{5.0cm}|p{9cm}|}
\hline
\multicolumn{1}{|l|}{\textbf{Guthaben-Verkäufer}} \\
\hline
can\_access\_own\\
can\_view\_bookings\\
can\_add\_bookings\\
\hline
\end{tabular}

\subsection{Genaue Zuordnung der Berechtigungen}

\begin{tabular}{|p{5.0cm}|p{9cm}|}
\hline
\multicolumn{2}{|l|}{\textbf{Club}} \\
\hline
can\_access\_all &  main (für Systemadministratoren)\\
can\_access\_own &  main \\
can\_view\_usergroups & listUserGroups \\
can\_view\_users & listCustomers, exportUsers \\
can\_view\_locations & listLocations \\
can\_view\_log & listLogs \\
can\_view\_sent\_newsletters & listNewsletters \\
can\_add\_users & createCustomer \\
can\_add\_locations & createLocation \\
can\_add\_usergroups & createUserGroup \\
can\_edit\_club & edit \\
can\_edit\_locations & saveLocationOrder \\
can\_send\_newsletters & createNewsletter \\
can\_set\_permissionGroup & createCustomer \\
\hline
\end{tabular}

\parskip 12pt

\begin{tabular}{|p{5.0cm}|p{9cm}|}
\hline
\multicolumn{2}{|l|}{\textbf{User}} \\
\hline
can\_access\_own &  main \\
can\_view\_bookings & accounting \\
can\_add\_bookings & createBooking \\
can\_edit\_users & edit \\
can\_delete\_users & delete \\
\hline
\end{tabular}

\begin{tabular}{|p{5.0cm}|p{9cm}|}
\hline
\multicolumn{2}{|l|}{\textbf{Location}} \\
\hline
can\_view\_locations & main \\
can\_view\_courts & listCourts \\
can\_add\_courts & createCourt \\
can\_edit\_locations & edit \\
can\_edit\_courts & saveCourtOrder \\
\hline
\end{tabular}

\begin{tabular}{|p{5.0cm}|p{9cm}|}
\hline
\multicolumn{2}{|l|}{\textbf{Court}} \\
\hline
can\_view\_timeslots & listTimeslots \\
can\_add\_timeslots & createTimeslots \\
can\_edit\_courts & edit \\
\hline
\end{tabular}

\begin{tabular}{|p{5.0cm}|p{9cm}|}
\hline
\multicolumn{2}{|l|}{\textbf{UserGroup}} \\
\hline
can\_edit\_usergroups & edit \\
\hline
\end{tabular}

\begin{tabular}{|p{5.0cm}|p{9cm}|}
\hline
\multicolumn{2}{|l|}{\textbf{ReportMgr}} \\
\hline
can\_view\_reports & renderReport \\
can\_view\_users & customers \\
can\_view\_usergroups & usergroups \\
\hline
\end{tabular}

\begin{tabular}{|p{5.0cm}|p{9cm}|}
\hline
\multicolumn{2}{|l|}{\textbf{Reservations}} \\
\hline
can\_view\_reservations & main \\
can\_delete\_reservations & cancel \\
\hline
\end{tabular}

\begin{tabular}{|p{5.0cm}|p{9cm}|}
\hline
\multicolumn{2}{|l|}{\textbf{Timeslot}} \\
\hline
can\_add\_reservations & reserve \\
can\_edit\_timeslots & edit \\
can\_delete\_timeslots & delete \\
\hline
\end{tabular}

\begin{tabular}{|p{5.0cm}|p{9cm}|}
\hline
\multicolumn{2}{|l|}{\textbf{Transaction}} \\
\hline
can\_view\_bookings & main \\
\hline
\end{tabular}

%%%----------------------------------------------------------
\section{Logging}
%%%----------------------------------------------------------

Tenez verwendet implizites Logging. Dabei wird immer ein JSON-String in der Datenbank abgelegt, wobei die Transformierung ins JSON-Format transparent erfolgt. Im Code muss nur noch \texttt{tenez.Logger.log(objToLog)} aufgerufen werden, wobei der Parameter \texttt{objToLog} ein normales JavaScript-Objekt ist. Im Normalfall werden folgende Felder in dem Objekt beschrieben:

\begin{itemize}
\item \textbf{type} - Typ des Eintrages\\
CREATE\_USER\\
ADD\_CREDIT\\
ADD\_DEBIT\\
EDIT\_CLUB\\
EDIT\_COURT\\
EDIT\_USER\\
EDIT\_USERGROUP\\
EDIT\_LOCATION\\
EDIT\_TIMESLOT\\
CREATE\_USER\\
CREATE\_COURT\\
CREATE\_LOCATION\\
CREATE\_USERGROUP\\
CREATE\_SYSADMIN\\
CREATE\_TIMESLOT\\
CREATE\_RESERVATION\\
DELETE\_RESERVATION\\
DELETE\_TIMESLOT\\
DELETE\_USER\\
SIGNIN\\
SIGNOUT\\
PASSWORD\_RESET\\
ADD\_CREDIT\\
ADD\_DEBIT

\item \textbf{message} - Englische Meldung
\item \textbf{message\_de} - Deutsche Meldung
\end{itemize}

Wird ein Logeintrag erstellt, so werden automatisch folgende Felder hinterlegt: IP-Adresse, Zeitpunkt, ausführender Benutzer, betroffener Club, Name der Applikation, HopObject-Prototype mit der aufgerufenen Action. Das Root-HopObject und jeder Club enthalten eine Collection \texttt{logs}. Auf beide sollte in der Applikation nur lesender Zugriff erfolgen!


%%%----------------------------------------------------------
\section{Eigenschaften von User-Objekten}
%%%----------------------------------------------------------

Die User-Objekte werden durch eindeutigen Benutzernamen identifiziert. Dieser darf keine Sonderzeichen, hierunter fallen auch Umlaute, außer den Unterstrich enthalten und besteht ansonsten nur aus den Buchstaben A bis Z, a bis z und den Ziffern 0 bis 9.

Für die Registrierung eines Kunden über das Frontend versucht Tenez einen Benutzernamen aus dem ersten Zeichen des Vornamens und dem Nachnamen zu generieren. Die Funktion \texttt{tenez.Util.sanitizeCharacters()} übernimmt dabei die Konvertierung von Sonderzeichen in ein entsprechendes ASCII-128 Zeichen. Kann kein Mapping zwischen dem eingegeben String und dem ASCII-128-Zeichensatz hergestellt werden, entfernt die Funktion ungültige Zeichen automatisch. Benutzernamen werden im Allgemeinen kleingeschrieben hinterlegt, Benutzereingaben sollen nicht auf Groß- oder Kleinschreibung achten.


%%%----------------------------------------------------------
\end{document}
%%%----------------------------------------------------------